package com.projetosi.web.server.sistema.objetos;

import com.projetosi.web.server.sistema.interfaces.IGenericObject;
import com.projetosi.web.server.sistema.util.Data;

/**
 * 
 * @author Felipe Jose, Filipe Alencar, Rodrigo de Brito, Thiago Goncalves, Victor Hugo Arcelino;
 *
 */

public class Mensagem implements IGenericObject{
	private boolean lida;
	private boolean ehPadrao;
	private String assunto;
	private String corpoDaMensagem;
	private Usuario remetente;
	private Usuario destinatario;
	private Data dataDeEnvio;
	private int timeCreated;
	private static int idC = 0;
	
	/**
	 * Construtor de uma mensagem offtopic
	 * @param assunto - Assunto Desejado
	 * @param mensagem - Mensagem desejada
	 * @param destinatario - A quem sera enviada a mensagem
	 * @param remetente - Usuario que envia a mensagem
	 * @throws Exception 
	 */
	public Mensagem(String assunto, String corpoDaMensagem, Usuario destinatario, Usuario remetente) throws Exception{
		setAssunto(assunto);
		setCorpoDaMensagem(corpoDaMensagem);
		setDestinatario(destinatario);
		setRemetente(remetente);
	    setDataDeEnvio(new Data());
	    setEhPadrao(false);
	    setLida(false);
	    timeCreated = idC++;
	}
	
	
	/**
	 * Retorna o tempo de criação da mensagem.
	 */
	public long getTimeCreated(){
		return this.timeCreated;
	}
	/**
	 * Construtor de Mensagens de emprestimos(Padrao)
	 * @param destinatario - Usuario que ira receber a requisicao de emprestimo
	 * @param remetente - Usuario que solicita o emprestimo
	 * @param item - Item solicitado
	 * @throws Exception 
	 */
	public Mensagem(Usuario destinatario, Usuario remetente, Item item) throws Exception{
		setAssunto("Empréstimo do item " + item.getNome() + " a " + remetente.getNome());
		setCorpoDaMensagem(remetente.getNome() + " solicitou o empréstimo do item " + item.getNome());
		setDestinatario(destinatario);
		setRemetente(remetente);
		setDataDeEnvio(new Data());
		setEhPadrao(true);
		setLida(false);
		this.timeCreated = idC++;
	}
	
	
	/**
	 * Metodo para retornar o assunto da mensagem;	
	 * @return Retorna o assunto do tipo String;
	 */
	public String getAssunto(){
		return this.assunto;
	}
	
	/**
	 * Metodo para determinar o assunto da mensagem;
	 * @param assunto - O assunto da mensagem a ser enviada;
	 * @throws Exception 
	 */
	private void setAssunto(String assunto) throws Exception {
		if(assunto == null || assunto.isEmpty()){
			throw new Exception("Assunto inválido"); 
		}
		this.assunto = assunto;
	}
	
	/**
	 * Metodo para retornar o corpo da mensagem;
	 * @return Retorna o corpo da mensagem do tipo String;
	 */
	public String getCorpoDaMensagem(){
		return this.corpoDaMensagem;
	}
	
	/**
	 * Metodo para modificar o corpo da mensagem;
	 * @param corpoDaMensagem - O novo corpo da mensagem;
	 * @throws Exception - Informacao NULL ou String vazia;
	 */
	private void setCorpoDaMensagem(String corpoDaMensagem) throws Exception{
		if(corpoDaMensagem == null || corpoDaMensagem.isEmpty()){
			throw new Exception("Mensagem inválida"); //alterado
		}
		this.corpoDaMensagem = corpoDaMensagem;
	}
	
	/**
	 * Metodo para retornar o destinatario da mensagem;
	 * @return Retorna o destinatario da mensagem do tipo Usuario;
	 */
	public Usuario getDestinatario(){
		return this.destinatario;
	}
	
	/**
	 * Metodo para determinar o destinatario da mensagem;
	 * @param destinatario - O destinatario da mensagem do tipo Usuario;
	 * @throws Exception 
	 */
	private void setDestinatario(Usuario destinatario) throws Exception {
		this.destinatario = destinatario;
	}
	
	/**
	 * Metodo para retornar o remetente da mensagem;
	 * @return Retorna o remetente da mensagem do tipo Usuario;
	 */
	public Usuario getRemetente(){
		return this.remetente;
	}
	
	/**
	 * Metodo para determinar o remetente da mensagem; 
	 * @param remetente - O remetente da mensagem do tipo Usuario;
	 */
	public void setRemetente(Usuario remetente) {
		this.remetente = remetente;
	}
	
	/**
	 * Metodo para retornar a data de envio da mensagem
	 * @return Retorna a data em que a mensagem foi enviada no formato String
	 */
	public Data getDataDeEnvio(){
		return this.dataDeEnvio;
	}
	
	/**
	 * Metodo para determinar a data em que a mensagem foi enviada;
	 * @param dataFormatada - Uma String com a data formatada; 
	 * Exemplo: "21/11/2011"
	 */
	public void setDataDeEnvio(Data novaData) {
		this.dataDeEnvio = novaData;
	}
	
	/**
	 * Metodo para retornar se a mensagem eh do tipo padrao ou nao;
	 * @return Um boolean indicando se a mensagem eh do tipo padrao;
	 */
	public boolean isPadrao(){
		return this.ehPadrao;
	}
	
	/**
	 * Metodo para determinar se a mensagem eh do tipo padrao ou nao;
	 * @param ehPadrao - Boolean que indica se a mensagem eh padrao;
	 */
	public void setEhPadrao(boolean ehPadrao){
		this.ehPadrao = ehPadrao;
	}
	
	/**
	 * Metodo para verificar se a mensagem ja foi lida;
	 * @return Retorna um boolean indicando se a mensagem ja foi lida ou nao;
	 */
	public boolean isLida() {
		return this.lida;
	}
	
	/**
	 * Metodo para determinar se a mensagem ja foi lida;
	 * @param lida - um boolean indicando se a mensagem foi lida ou nao;
	 */
	public void setLida(boolean lida) {
		this.lida = lida;
	}
}
